#include "wifiindicator.h"

WiFiIndicator::WiFiIndicator(QDeclarativeItem *parent) : QDeclarativeItem(parent)
{
    this->setFlag( QDeclarativeItem::ItemHasNoContents, false );

    /* хранит время в секундах с момента запуска */
    storeTime = 0;

    __timestamp = 60;

    /* ширина линии графика */
    pxLenGraph = 4;

    timeout = 3;
    timer.setInterval( timeout*1000 );
    QObject::connect( &timer, SIGNAL(timeout()), this, SLOT(updateWiFiData()) );

    iface = "wlan0";

    shiftX = 6;
    shiftY = 0;

    /* кисть и шрифт сетки */
    penGrid.setColor( QColor(120,120,120) );
    penGrid.setWidth(1);
    penGrid.setStyle( Qt::DashLine );
    fontGrid.setPointSize( 8 );

    /* кисть и шрифт системы координат */
    penSC.setColor( QColor("gray") );
    penSC.setWidth( 3 );

    viewTimestampMarker.enqueue(-1);

    wifiData = new WiFiData(this);
    QObject::connect( wifiData, SIGNAL(dataReady(bool)), this, SLOT(getWiFiData(bool)) );
    QObject::connect( wifiData, SIGNAL(dataError()), this, SLOT(getWiFiError()) );
}


void WiFiIndicator::getData()
{
}


void WiFiIndicator::timerStart()
{
    isUpdateRunning = false;
    //this->initSettings();
    //flFistGetTraff = true; /*выставляется для первого считывания байт из интерфейса, во избежании скачка графика*/
    timer.start();
    //qDebug() << "Monitor::timerStart()";
}

void WiFiIndicator::timerStop()
{
    timer.stop();
    //qDebug() << "Monitor::timerStop()";
}



void WiFiIndicator::paint( QPainter *paint, const QStyleOptionGraphicsItem *options, QWidget *widget )
{
    Q_UNUSED( options );
    Q_UNUSED( widget );

    Ly = lenghtY - shiftY;
    Lx = lenghtX - shiftX;

    paint->setRenderHints( QPainter::Antialiasing, true );

    this->drawGraph( paint );
}


void WiFiIndicator::drawSystemCoord( QPainter* paint )
{
    paint->setPen( penSC );

    paint->drawLine( shiftX, lenghtY-shiftY, lenghtX, lenghtY-shiftY ); //X
    paint->drawLine( shiftX, shiftY, shiftX, lenghtY-shiftY ); //Y
}


void WiFiIndicator::drawGrid( QPainter* paint )
{
    paint->setPen( penGrid );
    paint->setFont( fontGrid );

    int partY = 10;
    float stepLineY = (float)Ly / (float)(partY); /* шаг горизонтально (по оси Y) линии сетки */
    float it = 0.0;
    float currY = (float)Ly;
    QString txt("");
    while( it < (partY+1) )
    {
        penGrid.setColor( QColor(120,120,120) );
        paint->setPen( penGrid );
        paint->drawLine( shiftX, Ly-currY, lenghtX, Ly-currY );

        int i_it = (int)it;
        txt.sprintf("%d%%", i_it*10);
        if( i_it%2 == 0 ) {
            penGrid.setColor( QColor(255,255,255) );
            paint->setPen( penGrid );
            if( i_it != partY ) {
                paint->drawText( shiftX+5, currY-3, txt );
            } else {
                paint->drawText( shiftX+5, currY+9, txt );
            }
        }

        currY = currY - stepLineY;
        it += 1.0;
    }
}


void WiFiIndicator::drawGraph( QPainter* paint )
{
    QString grColorStr = "yellow";
    QColor colorGraph( grColorStr );

    /* отрисовка значений, заполняющих каждую деку входящего/исходящего трафика */
    int x = 0;

    if( dataGraph.length() < 1 ) {
        this->drawSystemCoord( paint );
        this->drawGrid( paint );
        return;
    }

    QPen penGraph( colorGraph );
    penGraph.setWidth( 2 );

    QList<float>::const_iterator itr_data;
    QList<int>::const_iterator itr_ts;

    itr_data = dataGraph.constEnd() - 1;
    itr_ts = viewTimestampMarker.end() - 1;

    while( itr_data != (dataGraph.constBegin()) )
    {
        float valueQueue1 = *(itr_data - 1);
        float valueQueue0 = *(itr_data);
        float d1 = Ly*valueQueue1;
        float d0 = Ly*valueQueue0;
        paint->setPen( penGraph );
        paint->drawLine( lenghtX-x, Ly-d0, lenghtX-x-pxLenGraph, Ly - d1 );
        //qDebug() << "drawLine("<<(lenghtX-x)<<","<<(Ly-d0)<<","<<(lenghtX-x-pxLenGraph)<<","<<(Ly - d1)<<")";

        int ts = *itr_ts;
        if( ts >= 0 ) {
            paint->setFont( fontGrid );

            penGrid.setColor( QColor(120,120,120) );
            paint->setPen( penGrid );
            paint->drawLine( lenghtX-x, 0, lenghtX-x, lenghtY-shiftY);

            penGrid.setColor( QColor(255,255,255) );
            paint->setPen( penGrid );
            paint->drawText( lenghtX-x-11, lenghtY-5, this->humanTimestamp(ts) );
        }

        --itr_data;
        --itr_ts;
        x += pxLenGraph;
    } //while

    /* отрисовка сетки и системы координат */
    this->drawSystemCoord( paint );
    this->drawGrid( paint );
}


QString WiFiIndicator::humanTimestamp( const int timestamp ) const
{
    QString retSrt;
    int delta_sec = timestamp;
    int Hs = delta_sec / 3600;
    if( Hs != 0 ) {
        delta_sec = delta_sec - Hs*3600;
    }

    int Ms = delta_sec / 60;
    if( Ms != 0 ) {
        delta_sec = delta_sec - 60*Ms;
    }

    int Ss = delta_sec;

    if( Hs == 0 ) {
        if( Ms == 0 ) {
            retSrt.sprintf("%02d", Ss );
        } else {
            retSrt.sprintf( "%d:%02d",  Ms, Ss );
        }
    } else {
        retSrt.sprintf( "%d:%02d:%02d", Hs, Ms, Ss );
    }

    return retSrt;
}

/*-------------*/

/* вызывается из QML для обновления данных вручную */
void WiFiIndicator::updateWiFiData()
{
    if(  isUpdateRunning ) { return; }

    isUpdateRunning = true;
    emit updateStatusChange();

    /* запрашиваем обновления данных в объекте wifiData */
    wifiData->requestWiFiData( iface );
}

void WiFiIndicator::getWiFiError()
{
    flDataExists = false;
    isUpdateRunning = false;
    emit updateStatusChange();
}

/* слот, вызывается когда получены новые данные */
void WiFiIndicator::getWiFiData( bool _flDataExists )
{
    /* список с WiFi данными */
    QList< Map > listWiFiData;

    float valLevel = 0.0;
    _val_per = 0.0;
    _val_dbm = 0.0;

    flDataExists = _flDataExists;
    /* забираем данные у объекта, получившего данные о wifi сетях */
    if( _flDataExists )
    {
        listWiFiData = wifiData->getData();

        QList<Map>::const_iterator itr;
        for( itr = listWiFiData.constBegin(); itr != listWiFiData.constEnd(); itr++ )
        {
            Map pQMapData = *itr;

            QString mac = (pQMapData["mac"]).toString();
            //qDebug() << "mac=" << mac << " macAddrWiFi="<<macAddrWiFi;
            if( mac == macAddrWiFi ) {
                bool ok;
                valLevel =  (pQMapData["quality"]).toFloat( &ok );

                _essid = (pQMapData["essid"]).toString();
                _val_per = (pQMapData["quality"]).toDouble();
                _val_dbm = (pQMapData["level"]).toDouble();
                break;
            }
        }
    }

    /* занесение данных в буфер */
    int dx = shiftX + pxLenGraph/2;
    while( (X+dx) > lenghtX )
    {
        viewTimestampMarker.dequeue();
        dataGraph.dequeue();
        X = X - pxLenGraph;
    }
    dataGraph.enqueue( valLevel );

    /* время работы */
    if ( storeTime%__timestamp == 0 ) {
        viewTimestampMarker.enqueue( storeTime );
    } else {
        viewTimestampMarker.enqueue( -1 );
    }

    X = X + pxLenGraph;

    emit changeValueParam();

    this->hide();
    this->show();

    isUpdateRunning = false;
    emit updateStatusChange();

    storeTime += timeout;
}
